home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
Buttons.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-10
|
8KB
|
354 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "Buttons.h"
#include "Class.h"
#include "TextItem.h"
#include "WindowSystem.h"
#include "Look.h"
bool gInButtonFlush;
//---- Button ------------------------------------------------------------------
NewAbstractMetaImpl0(Button,CompositeVObject);
Button::Button(int id, VObject *vop) : CompositeVObject(id, vop, 0)
{
}
Command *Button::DoLeftButtonDownCommand(Point, Token, int)
{
return new ButtonCommand(this, TestFlag(eButtonIdle));
}
void Button::Flush(int msec)
{
if (Enabled()) {
gInButtonFlush= TRUE;
DoTrackMouse(eTrackPress, contentRect.Center());
GraphicDelay(msec);
DoTrackMouse(eTrackRelease, contentRect.Center());
gInButtonFlush= FALSE;
}
}
void Button::DoTrackMouse(TrackPhase atp, Point lp)
{
if (Enabled() && TestFlag(eButtonIdle)) {
switch (atp) {
case eTrackPress:
Highlight(On);
case eTrackMove:
case eTrackIdle:
Control(GetId(), cPartToggle, (void*) 1);
break;
case eTrackRelease:
case eTrackExit:
Highlight(Off);
break;
default:
break;
}
} else
CompositeVObject::DoTrackMouse(atp, lp);
}
void Button::DrawHighlight(Rectangle)
{
}
void Button::SetOrigin(Point at)
{
VObject::SetOrigin(at);
if (Size() > 0)
At(0)->Align(at, GetExtent(), (VObjAlign)(eVObjHCenter|eVObjVCenter));
}
void Button::SetLabel(char *lb, bool redraw)
{
if (At(0)->IsKindOf(TextItem)) {
TextItem *ti= (TextItem*) At(0);
ti->SetString(lb);
SetOrigin(GetOrigin());
if (redraw)
ForceRedraw();
}
}
Metric Button::GetMinSize()
{
return CompositeVObject::GetMinSize();
}
//---- ButtonCommand -----------------------------------------------------------
ButtonCommand::ButtonCommand(Button* bf, bool idl)
{
item= bf;
lastinside= FALSE;
SetFlag(eCmdIdleEvents, idl);
}
void ButtonCommand::TrackFeedback(Point, Point, bool)
{
}
Command *ButtonCommand::TrackMouse(TrackPhase atp, Point, Point, Point np)
{
inside= item->ContainsPoint(np);
switch(atp) {
case eTrackPress:
if (inside)
item->DoTrackMouse(eTrackPress, np);
break;
case eTrackIdle:
if (inside)
item->DoTrackMouse(eTrackIdle, np);
break;
case eTrackExit:
item->DoTrackMouse(eTrackExit, np);
break;
case eTrackRelease:
if (inside)
item->DoTrackMouse(eTrackRelease, np);
else
item->DoTrackMouse(eTrackExit, np);
return gNoChanges;
case eTrackMove:
if (lastinside && !inside)
item->DoTrackMouse(eTrackExit, np);
else if (!lastinside && inside)
item->DoTrackMouse(eTrackPress, np);
else if (inside)
item->DoTrackMouse(eTrackMove, np);
break;
}
lastinside= inside;
return this;
}
//---- ActionButton ------------------------------------------------------------
NewMetaImpl0(ActionButton,Button);
ActionButton::ActionButton(int id, VObject *g, bool dflt) : Button(id, g)
{
SetFlag(eActionDefaultButton, dflt);
SetFlag(eVObjVFixed);
}
ActionButton::ActionButton(int id, char *t, bool dflt) : Button(id, new TextItem(t))
{
SetFlag(eActionDefaultButton, dflt);
SetFlag(eVObjVFixed);
}
Metric ActionButton::GetMinSize()
{
if (TestFlag(eActionDefaultButton))
return gLook->DefaultButtonLayout()->GetMinSize(this);
return gLook->ActionButtonLayout()->GetMinSize(this);
}
void ActionButton::DrawInner(Rectangle, bool highlight)
{
int code= 0;
if (Enabled())
SETBIT(code, 2);
if (highlight)
SETBIT(code, 3);
if (TestFlag(eActionDefaultButton))
gLook->DefaultButtonLayout()->Adorn(this, contentRect, code);
else
gLook->ActionButtonLayout()->Adorn(this, contentRect, code);
}
void ActionButton::Control(int id, int part, void *val)
{
if (part == cPartToggle)
part= cPartAction;
Button::Control(id, part, val);
}
//---- StateButton -------------------------------------------------------------
NewAbstractMetaImpl(StateButton,Button, (T(state)));
StateButton::StateButton(int id, int s) : Button(id)
{
state= s;
}
StateButton::StateButton(int id, char *label, int s) : Button(id)
{
state= s;
if (label)
Add(new TextItem(label));
}
StateButton::StateButton(int id, VObject *label, int s) : Button(id)
{
state= s;
if (label)
Add(label);
}
void StateButton::DoTrackMouse(TrackPhase atp, Point pp)
{
if (Enabled() && atp == eTrackRelease) {
SetValue((int) !state);
Control(GetId(), cPartToggle, (void*) state);
Highlight(Off);
} else
Button::DoTrackMouse(atp, pp);
}
void StateButton::SetValue(int st, bool redraw)
{
if (st != state) {
state= st;
Changed();
if (redraw)
ForceRedraw();
}
}
int StateButton::GetValue()
{
return state;
}
OStream& StateButton::PrintOn(OStream &s)
{
Button::PrintOn(s);
return s << state SP;
}
IStream& StateButton::ReadFrom(IStream &s)
{
Button::ReadFrom(s);
return s >> state;
}
//---- VObjectButton -----------------------------------------------------------
NewMetaImpl0(VObjectButton,StateButton);
VObjectButton::VObjectButton(int id, VObject *vop, int st) : StateButton(id, st)
{
Add(vop);
}
Metric VObjectButton::GetMinSize()
{
VObject *inner= At(0);
Metric m= gLook->ActionButtonLayout()->GetMinSize(this);
SetFlag(eVObjHFixed, inner->TestFlag(eVObjHFixed));
SetFlag(eVObjVFixed, inner->TestFlag(eVObjVFixed));
return m;
}
void VObjectButton::DrawInner(Rectangle, bool highlight)
{
int code= 0;
if (state)
SETBIT(code, 1);
if (Enabled())
SETBIT(code, 2);
if (highlight)
SETBIT(code, 3);
gLook->ActionButtonLayout()->Adorn(this, contentRect, code);
}
//---- RadioButton -------------------------------------------------------------
NewMetaImpl0(RadioButton,StateButton);
RadioButton::RadioButton(int id, bool state) : StateButton(id, state)
{
SetFlag(eVObjVFixed|eVObjHFixed);
}
RadioButton::RadioButton(int id, char *label, bool state)
: StateButton(id, label, state)
{
SetFlag(eVObjVFixed|eVObjHFixed);
}
RadioButton::RadioButton(int id, VObject *label, bool state)
: StateButton(id, label, state)
{
SetFlag(eVObjVFixed|eVObjHFixed);
}
Metric RadioButton::GetMinSize()
{
return gLook->RadioButtonLayout()->GetMinSize(this);
}
void RadioButton::SetOrigin(Point at)
{
VObject::SetOrigin(at);
gLook->RadioButtonLayout()->SetOrigin(this, at);
}
void RadioButton::DrawInner(Rectangle, bool highlight)
{
int code= 0;
if (state)
SETBIT(code, 1);
if (Enabled())
SETBIT(code, 2);
if (highlight)
SETBIT(code, 3);
gLook->RadioButtonLayout()->Adorn(this, contentRect, code);
}
//---- ToggleButton ------------------------------------------------------------
NewMetaImpl0(ToggleButton,StateButton);
ToggleButton::ToggleButton(int id, bool state) : StateButton(id, state)
{
SetFlag(eVObjVFixed|eVObjHFixed);
}
ToggleButton::ToggleButton(int id, char *label, bool state)
: StateButton(id, label, state)
{
SetFlag(eVObjVFixed|eVObjHFixed);
}
ToggleButton::ToggleButton(int id, VObject *label, bool state)
: StateButton(id, label, state)
{
SetFlag(eVObjVFixed|eVObjHFixed);
}
Metric ToggleButton::GetMinSize()
{
return gLook->ToggleButtonLayout()->GetMinSize(this);
}
void ToggleButton::SetOrigin(Point at)
{
VObject::SetOrigin(at);
gLook->ToggleButtonLayout()->SetOrigin(this, at);
}
void ToggleButton::DrawInner(Rectangle, bool highlight)
{
int code= 0;
if (state)
SETBIT(code, 1);
if (Enabled())
SETBIT(code, 2);
if (highlight)
SETBIT(code, 3);
gLook->ToggleButtonLayout()->Adorn(this, contentRect, code);
}